/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;
/**
 *
 * @author melvinrafaelvegavega
 */
public class xml {
  private Document dom;
  private DocumentBuilderFactory dbf;
  private DocumentBuilder db;
  private String archivo;
  private Element raiz;
  private Element actual;
  private int encontrados;
  private int[] indice;
  private int indiceactual;
  private Element[] hermano;
  private String[] tmp;
  private String[][] pares;
  private int medida;
  private int longitudreal; 
  /*public static void main(String[] args)
  {
   xml reader=new xml("symbolos.xml");
   reader.addFiltro("tipo","asignacion");
   reader.updFiltro("tipo","estructura");
   reader.addFiltro("name","logica");
   String[] srt=reader.obtItems("TOKEN");
   System.out.println(reader.getLength());
   for(int j=0;j<reader.getLength();j++)
   {
    System.out.println(srt[j]);
   }
  }*/
   public xml(String Archivo){
    try {
     dbf = DocumentBuilderFactory.newInstance();
     db=dbf.newDocumentBuilder();
     archivo=new String(Archivo);
     dom = db.parse(archivo);
     Element elementos=dom.getDocumentElement();
     actual=elementos;
     pares=new String[30][2];
     medida=-1;
     longitudreal=0;
    }catch(ParserConfigurationException pce) {
    pce.printStackTrace();
   }catch(SAXException se) {
    se.printStackTrace();
   }catch(IOException ioe) {
    ioe.printStackTrace();
   }
    
  }
  
  protected String[] obtItems(String tagName){
      NodeList nodos;
      Element temporal;
      int r=-1;
      longitudreal=0;
      try
      {
        nodos=actual.getElementsByTagName(tagName);
	tmp=new String[nodos.getLength()];
        for(int i=0;i<nodos.getLength();i++){
          temporal=(Element)nodos.item(i);
	  if(comprobarFiltro(temporal))
          {
           r++;
           tmp[r]=new String(temporal.getFirstChild().getNodeValue());
	   longitudreal++;
	  }
        }
      }
      catch(NullPointerException npe){
            System.out.println("Error, no se encontraron nodos hijos");
        }
      return tmp;
  }

  protected String obtParamValue(String tagName,String param,String valor){
   NodeList nodos;
   Element temporal;
   String tmpParam=new String("");
   int r=-1;
   try
   {
    nodos=actual.getElementsByTagName(tagName);
    for(int i=0;i<nodos.getLength();i++){
     temporal=(Element)nodos.item(i);
     if((new String(temporal.getFirstChild().getNodeValue())).equals(valor))
     {
      r++;
      tmpParam=new String(temporal.getAttribute(param));
     }
    }
   }
   catch(NullPointerException npe){
    System.out.println("Error, no se encontraron nodos hijos");
   }
   return tmpParam;
  }

  protected void addFiltro(String param,String valor){
      medida++;
      pares[medida]=new String[2];
      pares[medida][0]=new String(param);
      pares[medida][1]=new String(valor);
  }

  protected void updFiltro(String param,String valor){
      pares[findParam(param)][1]=valor;
  }
  
  protected void delFiltro(String param){
     int delpos=findParam(param);
     while(delpos<medida){
      pares[delpos]=pares[delpos+1];
      delpos++;
     }
     pares[medida]=null;
     medida--;
  }

  public int findParam(String param){
   int x=0;
   for(int i=0;i<=medida;i++){
    if(pares[i][0].equals(param))
     x=i;
   }
   return x;
  }

  protected boolean comprobarFiltro(Element elemento){
      boolean verdadero=true;
      for(int i=0;i<=medida;i++)
      {
       if(!(elemento.getAttribute(pares[i][0]).equals(pares[i][1])))
       {
	verdadero=false; 
       }
      }
      return verdadero;
  }

  protected int getLength(){
	  return longitudreal;
  }
}
